home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / mmdf / mmdf-IIb.43 / src / tools / nictable.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-03-11  |  6.2 KB  |  300 lines

  1. /*
  2.  *                      N I C T A B L E . C
  3.  *
  4.  *                    (Revised as of 28 March)
  5.  *
  6.  *  Generates domain or channel tables from dhosts.txt
  7.  *  (Based on code for dmtable.c from Steve Kille)
  8.  *
  9.  *    nictable <-D,-C,-T> [infile] [-d domain] [-t transport] [-s service]
  10.  *      infile is location of dhosts.txt
  11.  *      -D build a domain table
  12.  *      -C build a channel table
  13.  *      -T build a top table
  14.  *      -d specifies domain to look for (e.g. ARPA or CSNET)
  15.  *      -t specifies transport protocol (e.g. TCP)
  16.  *      -s specifies service to look for (e.g. SMTP)
  17.  *
  18.  */
  19. #include "util.h"
  20. #include "mmdf.h"
  21.  
  22. char    *domain,                /* domain to add                        */
  23.     *transport,             /* transport service to look for        */
  24.     *service;               /* name of service to look for          */
  25. int     domainlen = 0;
  26. int     target = 0;
  27. #define T_DOMAIN        1
  28. #define T_CHANNEL       2
  29. #define T_TOP           3
  30.  
  31. FILE    *infp = stdin;
  32.  
  33. char    entry[1000],            /* fully-assembled entry (multi-line) */
  34.     linebuf[1000];          /* current line */
  35.  
  36. extern  char *index();
  37. extern  char *rindex();
  38. extern  char *strncpy();
  39.  
  40. main (argc, argv)
  41.     int argc;
  42.     char *argv[];
  43. {
  44.     mmdf_init (argv[0]);
  45.     arg_init (argc, argv);
  46.  
  47.     doit ();
  48.     exit (0);
  49. }
  50. /* */
  51.  
  52. arg_init (argc, argv)
  53.     int argc;
  54.     char *argv[];
  55. {
  56.     register int ind;
  57.  
  58.     if (argc < 2) {
  59.     fputs ("Usage:  nictable <-D,-C,-T> [infile] [-d domain] [-t transport] [-s service]\n",
  60.         stderr);
  61.     exit(NOTOK);
  62.     }
  63.  
  64.     for (ind = 1; ind < argc; ind++)
  65.     {
  66.     if (argv[ind][0] != '-')
  67.     {
  68.         if ((infp = fopen (argv[ind], "r")) == NULL)
  69.         {
  70.         fprintf (stderr,  "Unable to open '%s':", argv[ind]);
  71.         perror ("");
  72.         exit (NOTOK);
  73.         }
  74.     }
  75.     else
  76.         switch (argv[ind][1])
  77.         {
  78.         case 'C':
  79.             target = T_CHANNEL;
  80.             break;
  81.  
  82.         case 'D':
  83.             target = T_DOMAIN;
  84.             break;
  85.  
  86.         case 'T':
  87.             target = T_TOP;
  88.             break;
  89.  
  90.         case 's':
  91.             service = argv[++ind];
  92.             break;
  93.  
  94.         case 't':
  95.             transport = argv[++ind];
  96.             break;
  97.  
  98.         case 'd':
  99.             domain = argv[++ind];
  100.             domainlen = strlen (domain);
  101.             break;
  102.         }
  103.     }
  104.  
  105.     if (target == 0) {
  106.     fputs ("nictable: you must specify target type (-C, -D, -T)\n", stderr);
  107.     exit(NOTOK);
  108.     }
  109. }
  110. /* */
  111.  
  112. #define NUMPARTS    75
  113.  
  114. doit ()
  115. {
  116.     int argc;
  117.     char *argv[NUMPARTS];       /* fields of entry */
  118.  
  119.     fgets (linebuf, sizeof (linebuf), infp);
  120.                 /* load first line into buffer */
  121.     while (getentry ())
  122.     {
  123.     argc = cstr2arg (entry, NUMPARTS, argv, ':');
  124.     switch (argc)
  125.     {
  126.         case -1:
  127.         fprintf (stderr, "problem parsing entry '%s':", entry);
  128.         continue;
  129.  
  130.         case 0:
  131.         case 1:
  132.         case 2:
  133.         continue;
  134.     }
  135.  
  136.     if (!lexequ (argv[0], "host"))
  137.         continue;           /* only process host entries    */
  138.  
  139.     if (goodservice (argv [argc - 2]))
  140.         output (argc, argv);
  141.     }
  142. }
  143. /* */
  144.  
  145. getentry ()
  146. {
  147.     if (linebuf[0] != '\0')
  148.     {
  149.     if (linebuf[0] != ';')
  150.         (void) strcpy (entry, linebuf);
  151.     linebuf[0] = '\0';
  152.     }
  153.     else
  154.     entry[0] = '\0';
  155.  
  156.     while (fgets (linebuf, sizeof (linebuf), infp) != NULL)
  157.     switch (linebuf[0])
  158.     {
  159.         case ';':           /* comment */
  160.         break;
  161.  
  162.         case ' ':           /* continuation */
  163.         case '\t':
  164.         strcat (entry, linebuf);
  165.         break;
  166.  
  167.         default:            /* new entry */
  168.         spstrip (entry);
  169.         return (TRUE);
  170.     }
  171.  
  172.     if (!feof (stdin))
  173.     {
  174.     perror ("problem reading host table");
  175.     exit (NOTOK);
  176.     }
  177.  
  178.     spstrip (entry);
  179.     return ((entry[0] == '\0') ? FALSE : TRUE);
  180. }
  181. /* */
  182.  
  183. goodservice (str)      /* entry have right transport/service? */
  184. char *str;
  185. {
  186.     int sargc;
  187.     char *sargv[NUMPARTS];
  188.     char *ts;               /* transport from entry         */
  189.     char *sv;               /* service from entry           */
  190.     int i;
  191.  
  192.     if (transport == (char *)0 && service == (char *)0)
  193.         return (TRUE);
  194.  
  195.     sargc = cstr2arg (str, NUMPARTS, sargv, ',');
  196.     for (i = 0; i < sargc; i++)
  197.     {
  198.         ts = sargv [i];
  199.         if ((sv = index (ts, '/')) != 0)
  200.             *sv++ = '\0';
  201.  
  202.         if (transport != (char *)0 && !lexequ (transport, ts))
  203.             continue;
  204.  
  205.         if (sv == 0)
  206.         return (TRUE);          /* implies all service  */
  207.  
  208.         if (service != (char *)0 && (!lexequ (service, sv)))
  209.             continue;
  210.  
  211.         return (TRUE);
  212.     }
  213.     return (FALSE);
  214. }
  215.  
  216. gooddomain (str)      /* entry have right domain? */
  217. char *str;
  218. {
  219.     int len;
  220.  
  221.     if (domain == (char *)0)
  222.         return (TRUE);
  223.     if ((len = strlen (str) - domainlen) < 0)
  224.         return (FALSE);
  225.     if ((len == 0 || str[len - 1] == '.') && lexequ (domain, str+len))
  226.         return (TRUE);
  227.     return (FALSE);
  228. }
  229. /* */
  230. /*ARGSUSED*/
  231. output (argc, argv)       /* output the list of host references */
  232.     int argc;
  233.     char *argv[];
  234. {
  235.     char *oargv[NUMPARTS];
  236.     char *p;
  237.     int i;
  238.     int oargc;
  239.     char buf [LINESIZE];
  240.  
  241.     if (target == T_CHANNEL) {
  242.     if ((p = index (argv [2], ',')) != 0)
  243.         *p = '\0';
  244.     oargc = cstr2arg (argv [1], NUMPARTS, oargv, ',');
  245.     for (i = 0; i < oargc; i++)
  246.         printf ("%s:%s\n", argv [2], oargv [i]);
  247.     } else if (target == T_DOMAIN) {
  248.     oargc = cstr2arg (argv [2], NUMPARTS, oargv, ',');
  249.     if (gooddomain (oargv[0]))
  250.     {
  251.         if (domainlen) {
  252.         (void) strncpy (buf, oargv[0], strlen(oargv[0])-domainlen-1);
  253.         buf [strlen(oargv[0]) - domainlen - 1]  = '\0';
  254.         } else {  /* KLUDGE: No domain specified, wing it! */
  255.         (void) strcpy (buf, oargv[0]);
  256.         if (p = rindex(buf, '.'))
  257.             *p = '\0';
  258.         }
  259.         printf ("%s:%s\n", buf, oargv [0]);
  260.         for (i = 1; i < oargc; i++)
  261.         if ((index(oargv[i], '.') == (char *) 0)
  262.             && !lexequ (buf, oargv[i]))
  263.             printf ("%s:%s\n", oargv  [i], oargv [0]);
  264.     }
  265.     } else if (target == T_TOP) {
  266.     oargc = cstr2arg (argv [2], NUMPARTS, oargv, ',');
  267.     if (gooddomain (oargv[0]))
  268.     {
  269.         for (i = 1; i < oargc; i++)
  270.         if ((index(oargv[i], '.') != (char *) 0)
  271.             && !gooddomain (oargv[i]))
  272.             printf ("%s:%s\n", oargv  [i], oargv [0]);
  273.     }
  274.     else
  275.     {
  276.         for (i = 0; i < oargc; i++)
  277.         if (index(oargv[i], '.')  != (char *) 0)
  278.             printf ("%s:%s\n", oargv  [i], oargv [0]);
  279.     }
  280.     } else {
  281.     /* Invalid target */
  282.     fprintf (stderr, "Internal nictable error, target is %d\n", target);
  283.     exit (NOTOK);
  284.     }
  285.  
  286. }
  287.  
  288. spstrip (str)           /* strip LWSP chars                     */
  289. char *str;
  290. {
  291.     char *src, *dest;
  292.  
  293.     for (src = dest = str; *src != '\0';)
  294.         if (!isspace (*src))
  295.             *dest++ = *src++;
  296.         else
  297.             src++;
  298.     *dest ='\0';
  299. }
  300.